package com.cdut.hwadeefsc.controller;

import com.cdut.hwadeefsc.dto.UserCreateDTO;
import com.cdut.hwadeefsc.dto.UserUpdateDTO;
import com.cdut.hwadeefsc.entity.users;
import com.cdut.hwadeefsc.service.usersService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;


// 假设Result是自定义响应工具类（非Lombok实现）
import com.cdut.hwadeefsc.common.Result;

@RestController
@RequestMapping("/api/users")
public class usersController {

    @Autowired
    private usersService usersService;

    /**
     * 获取当前登录用户信息
     */
    @GetMapping("/me")
    public Result getCurrentUser() {
        String IdStr = usersService.getCurrentId();
        if (IdStr == null || IdStr.isEmpty()) {
            return Result.error("未获取到用户ID, 请先登录");
        }

        Long userId;
        try {
            userId = Long.parseLong(IdStr);
        } catch (NumberFormatException e) {
            return Result.error("用户ID格式错误");
        }

        users user = usersService.getById(userId);
        if (user == null) {
            return Result.error("用户不存在");
        }
        return Result.success("获取当前用户信息成功", user);
    }

    /**
     * 分页查询用户列表（带角色和组织筛选）
     */
    @GetMapping("/list")
    public Result getUserList(
            @RequestParam(required = false) String role,
            @RequestParam(required = false) Long organizationId,
            @RequestParam(defaultValue = "1") Integer pageNum,
            @RequestParam(defaultValue = "10") Integer pageSize
    ) {
        //if (!hasPermission("admin", "teacher")) {
        //    return Result.error("没有权限访问用户列表");
        //}

        Page<users> page = new Page<>(pageNum, pageSize);
        IPage<users> userPage = usersService.queryUserPage(page, role, organizationId);

        return Result.success("查询用户列表成功", userPage);
    }

    /**
     * 审核家长注册（班主任权限）
     */
    @PutMapping("/approve/{Id}")
    public Result approveParent(@PathVariable Long Id) {
        if (!hasPermission("teacher")) {
            return Result.error("仅班主任可审核家长注册");
        }

        users user = usersService.getById(Id);
        if (user == null) {
            return Result.error("用户不存在");
        }
        // 没有status字段，通过角色+创建时间（30天内）判断待审核状态
        if (!"parent".equals(user.getRole()) ||
                user.getCreatedAt() == null ||
                user.getCreatedAt().before(new Date(System.currentTimeMillis() - 30L * 24 * 60 * 60 * 1000))) {
            return Result.error("只能审核30天内注册的家长用户");
        }

        // 无需设置status，仅更新时间标识已处理
        user.setUpdatedAt(new Date());
        boolean success = usersService.updateById(user);

        return success ? Result.success("审核通过") : Result.error("审核失败");
    }

    /**
     * 管理员创建用户
     */
    @PostMapping("/create")
    public Result createUser(@RequestBody UserCreateDTO userDTO) {
        if (!hasPermission("admin")) {
            return Result.error("仅管理员可创建用户");
        }

        if (!"teacher".equals(userDTO.getRole()) && !"leader".equals(userDTO.getRole())) {
            return Result.error("只能创建老师或领导角色的用户");
        }

        users user = new users();
        user.setName(userDTO.getName());
        user.setRole(userDTO.getRole());
        user.setCreatedAt(new Date());
        user.setUpdatedAt(new Date());

        boolean success = usersService.save(user);
        return success ? Result.success("用户创建成功", user.getId()) : Result.error("用户创建失败");
    }


    /**
     * 更新用户信息
     */
    @PutMapping("/update/{Id}")
    public Result updateUser(@PathVariable Long Id, @RequestBody UserUpdateDTO userDTO) {
        String currentId = usersService.getCurrentId();
        // 新增：先判断当前用户是否已登录
        if (currentId == null) {
            return Result.error("请先登录");
        }
        // 再进行权限判断
        if (!currentId.equals(Id.toString()) && !hasPermission("admin")) {
            return Result.error("没有权限更新该用户信息");
        }


        users user = usersService.getById(Id);
        if (user == null) {
            return Result.error("用户不存在");
        }

        if (userDTO.getName() != null) {
            user.setName(userDTO.getName());
        }
        if (hasPermission("admin") && userDTO.getRole() != null) {
            user.setRole(userDTO.getRole());
        }
        user.setUpdatedAt(new Date());

        boolean success = usersService.updateById(user);
        return success ? Result.success("用户信息更新成功") : Result.error("用户信息更新失败");
    }

    /**
     * 查询所有未审核用户（仅管理员/老师可访问）
     */
    @GetMapping("/unapproved")
    public Result getUnapprovedUsers(
            @RequestParam(defaultValue = "1") Integer pageNum,
            @RequestParam(defaultValue = "10") Integer pageSize
    ) {
        if (!hasPermission("admin", "teacher")) {
            return Result.error("没有权限访问未审核用户列表");
        }

        Page<users> page = new Page<>(pageNum, pageSize);
        IPage<users> unapprovedPage = usersService.getUnapprovedUsers(page);
        return Result.success("查询未审核用户成功", unapprovedPage);
    }

    /**
     * 删除用户
     */
    @DeleteMapping("/delete/{Id}")
    public Result deleteUser(@PathVariable Long Id) {
        if (!hasPermission("admin")) {
            return Result.error("仅管理员可删除用户");
        }

        boolean success = usersService.removeById(Id);
        return success ? Result.success("用户删除成功") : Result.error("用户删除失败");
    }

    /**
     * 权限校验辅助方法
     */
    private boolean hasPermission(String... allowedRoles) {
        String IdStr = usersService.getCurrentId();
        if (IdStr == null) {
            return false;
        }
        Long userId;
        try {
            userId = Long.parseLong(IdStr);
        } catch (NumberFormatException e) {
            return false;
        }

        users currentUser = usersService.getById(IdStr);
        if (currentUser == null) {
            return false;
        }

        String userRole = currentUser.getRole();
        for (String role : allowedRoles) {
            if (role.equals(userRole)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 密码加密（示例实现）
     */
    private String encryptPassword(String rawPassword) {
        // 实际项目中使用BCrypt等算法
        return rawPassword; // 临时占位
    }
}